package com.yc.wxcontroller;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.yc.service.impl.SubscriptionMessageServiceImpl;
import com.yc.vo.SubscriptionMessage;
import com.yc.vo.WeChatTemplateMsg;
import io.swagger.annotations.Api;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import javax.rmi.CORBA.Util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author cg
 * @version 1.0
 * @date 2023/12/24 16:59
 */
@Api("微信公众号消息订阅控制器")
@RestController
@RequestMapping("/wx/massage")
public class WXSubscriptionMessageController {

    @Resource
    private SubscriptionMessageServiceImpl messageService;


    //公众号id  //wxe66321e4ae052f75
    private static final String appId="wxe66321e4ae052f75";     //  测试：wxb020ed66296d8fc6
    //开发者密码appSecret  //77036374af8547876fe394b169c84953
    private static final String appSecret="77036374af8547876fe394b169c84953";    //测试：c169f7fc97033a87e496a821390a410f


    /**
     * 需要定时推送  在用户上课的前一天推送明天的上课情况
     * 每天晚上6点执行推送
     * 消息推送  需要： 1.openid 即wx用户   accessToken 授权token
     * @return
     */
    @Scheduled(cron = "0 0 18 * * ?")
    @GetMapping("/sendMessage")
    public  void sendMessage() throws Exception {
        // 公众号的模板id(也有相应的接口可以查询到)  //
        String templateId = "dbnM17W_ZgyPvnsiHhZtE-SoH6vLoc2WtrbJR0SInrs";   //  测试：Gzs-kwXxCjx_vYxWqZ00UGIjwFEf7p0v6QQwWkzbvYs
        //先获取accessToken  此token有效期 2小时  但好像消息推送都只在6点推送其余时间貌似不需要推送 如果没有其他需要accessToken的功能 应该不需要缓存（上限2000个）
        //access_token是公众号的全局唯一接口调用凭据，公众号调用各接口时都需使用access_token TODO:如果后续还有别的功能也要 那么就需要缓存
        //即每天6点获取一次即可
        String accessToken = messageService.getAccessToken(appId, appSecret);
        Map<String,Object> paramap=new HashMap<>();
        List<SubscriptionMessage> messageList = messageService.sendMessage();

        //如果查出来是空 代表明天所有人都没课 直接结束方法 不用发送
        if (messageList.isEmpty()){
            return ;
        }

        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
//        上课时间
//        {{time1.DATA}}
//        课程名称
//        {{thing2.DATA}}
//        班级名称
//        {{thing4.DATA}}
//        上课老师
//        {{thing5.DATA}}
//        上课地点
//        {{thing6.DATA}}
        //模版消息封装
        RestTemplate restTemplate = new RestTemplate();
        //拼接base参数
        Map<String, Object> sendBody = new HashMap<>();
        for (SubscriptionMessage subscriptionMessage : messageList) {
            //此处key value需要和消息模版对应
                                //模版消息对应的值字段必须为 value
            paramap.put("time1",new WeChatTemplateMsg(subscriptionMessage.getDate()));  //上课时间
            paramap.put("thing2",new WeChatTemplateMsg(subscriptionMessage.getCoursename())); //课程名称
            paramap.put("thing4",new WeChatTemplateMsg(subscriptionMessage.getCname())); //班级名称
            paramap.put("thing5",new WeChatTemplateMsg(subscriptionMessage.getNickname())); //上课老师
            paramap.put("thing6",new WeChatTemplateMsg(subscriptionMessage.getClassroom()));  //上课地点
                                    //subscriptionMessage.getAppid()
            sendBody.put("touser", subscriptionMessage.getAppid());    // openId  发送给哪个用户  测试：o1Tuk6kwxTnYyufYn6PaiMt_HeQE
         //   sendBody.put("url", "www.baidu.com");         // 点击模板信息跳转地   TODO 换成小程序课表地址  如果设置那么点击会跳转至小程序
            sendBody.put("data", paramap);                   // 模板参数
            sendBody.put("template_id", templateId);      // 模板Id
            //发送POST请求
            ResponseEntity<String> forEntity = restTemplate.postForEntity(url, sendBody, String.class);

            JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody());

            String messageCode = jsonObject.getString("errcode");

            String msgId = jsonObject.getString("msgid");
            System.out.println("messageCode : " + messageCode + ", msgId: " +msgId);


        }






    }












}
